// 1. Definiamo la struttura per contenere i dati del pulsante struct Pulsante { int pin; int statoFiltrato; int ultimoStatoLettura; unsigned long ultimoTempoDebounce; }; // 2. Creiamo un'istanza della struttura per il nostro pulsante // Pin 7, stato iniziale HIGH (per pullup), timer a 0 Pulsante mioPulsante = {7, HIGH, HIGH, 0}; const int ledPin = 13; unsigned long timerSeriale = 0; void setup() { Serial.begin(9600); pinMode(mioPulsante.pin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { // 3. Chiamiamo la funzione passandogli la nostra struttura int stato = leggiPulsanteFiltrato(mioPulsante); // 4. Usiamo lo stato filtrato per comandare il LED if (stato == LOW) { digitalWrite(ledPin, HIGH); // Accendi LED se premuto } else { digitalWrite(ledPin, LOW); // Spegni se rilasciato } // Stampa lo stato ogni 2 secondi come richiesto if (millis() - timerSeriale >= 2000) { timerSeriale = millis(); Serial.print("Stato pulsante filtrato: "); Serial.println(stato == LOW ? "PREMUTO" : "RILASCIATO"); } } // Funzione universale di filtro int leggiPulsanteFiltrato(Pulsante &p) { int lettura = digitalRead(p.pin); // Se la lettura fisica è diversa dall'ultima volta che abbiamo guardato if (lettura != p.ultimoStatoLettura) { p.ultimoTempoDebounce = millis(); // Reset del timer } // Se il segnale è rimasto stabile per più di 50ms if ((millis() - p.ultimoTempoDebounce) > 50) { p.statoFiltrato = lettura; } p.ultimoStatoLettura = lettura; // Salva la lettura per il prossimo ciclo return p.statoFiltrato; }